package enumAndAnnotation;

/**
 * 枚举练习
 */
public class EnumExercise06 {

    public static void main(String[] args) {
        /*
            1)有一个交通工具接口类 Vehicles 有 work 接口
            2)有 Horse类 和 Boat类 分别实现 Vehicles
            3)创建交通工具工厂类，有两个方法分贝获得交通工具 Horse 和 Boat
            4)有 Person类，有 name 和 Vehicles 属性，在构造器中为两个属性赋值
            5)实例化 Person 对象"唐僧"，要求一般情况下用Horse作为交通工具，遇到大河时用Boat作为交通工具
            6)增加一个情况，如果唐僧过火焰山，使用飞机
         */
        Person person = new Person("唐僧", new Horse());
        person.common();//一般情况下
        person.passRiver();//过河
        person.flyMountain();//过火焰山
        person.common();//一般情况下
        person.passRiver();//过河
        person.flyMountain();//过火焰山

    }
}

interface Vehicles {

    public void work();
}

class Horse implements Vehicles {


    @Override
    public void work() {
        System.out.println("一般情况下，使用马前进...");
    }

}

class Boat implements Vehicles {


    @Override
    public void work() {
        System.out.println("过河的时候，使用小船...");
    }

}

class Plane implements Vehicles {

    @Override
    public void work() {
        System.out.println("过火焰山的时候，使用飞机...");
    }
}

class VehiclesFactory {

    //将方法做成static比较方便
    public static Horse getHorse() {
        return new Horse();
    }

    public static Boat getBoat() {
        return new Boat();
    }

    public static Plane getPlane() {
        return new Plane();
    }
}

class Person {

    private String name;

    private Vehicles vehicles;

    // 在创建人对象时，事先分配一个交通工具
    public Person (String name, Vehicles vehicles) {
        this.name = name;
        this.vehicles = vehicles;
    }

    //如何不浪费在构建对象时传入的交通工具
    public void passRiver() {

        //先得到船
        //如果当前的交通工具不是船，则获取船
        if (!(this.vehicles instanceof Boat)) {
            this.vehicles = VehiclesFactory.getBoat();
        }

        //如何防止始终使用的是传入的交通工具对象 instanceof
        this.vehicles.work();
    }

    public void common() {
        //得到马
        //判断一下当前的 vehicles 属性 是否已经存在
        //如果当前的交通工具不是马，则获取马
        if (!(this.vehicles instanceof Horse)) {
            //是一种向上转型
            this.vehicles = VehiclesFactory.getHorse();
        }
        //这里体现使用接口调用
        this.vehicles.work();
    }

    public void flyMountain() {
        if (!(this.vehicles instanceof Plane)) {
            this.vehicles = VehiclesFactory.getPlane();
        }
        this.vehicles.work();
    }
}